package com.liliudong.rommath.biz.sys.result;

import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson2.JSON;
import com.liliudong.rommath.biz.sys.entity.SysMenu;
import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * @author liliudong
 * @date 2025年01月04日 18:06
 */
@Data
public class SysMenuRoutesResult {
    /**
     * 路由路径
     */
    private String path;

    /**
     * 路由名称（必须保持唯一）
     */
    private String name;

    /**
     * 路由重定向（默认跳转地址）
     */

    private String redirect;

    /**
     * 按需加载需要展示的页面
     */

    private String component;

    /**
     * 路由元信息
     */
    private Meta meta;

    public Map<String, Object> toMap() {
        return Convert.toMap(String.class, Object.class, JSON.parseObject(JSON.toJSONString(this), Map.class));
    }

    @Data
    public static class Meta {

        /**
         * 菜单名称
         */

        private String title;

        /**
         * 菜单图标
         */

        private String icon;
        /**
         * 菜单名称右侧的额外图标
         */

        private String extraIcon;
        /**
         * 是否在菜单中显示 0.否 1.是
         */

        private Integer showLink;
        /**
         * 是否显示父级菜单
         */

        private Integer showParent;

        /**
         * 按钮权限标识符
         */
        private List<String> auths;
        /**
         * 是否缓存该路由页面（开启后，会保存该页面的整体状态，刷新后会清空状态）
         */

        private Integer keepAlive;
        /**
         * 需要内嵌的iframe链接地址
         */

        private String frameSrc;

        /**
         * 内嵌的iframe页面是否开启首次加载动画
         */

        private Integer frameLoading;

        /**
         * 当前菜单名称或自定义信息禁止添加到标签页
         */

        private Integer hiddenTag;

        /**
         * 当前菜单名称或自定义信息固定添加到标签页
         */

        private Integer fixedTag;

        /**
         * 将某个菜单激活
         */

        private String activePath;

        /**
         * 动画
         */
        private Transition transition;

        public static Meta of(SysMenu sysMenu) {
            Transition.of(sysMenu);
            Meta meta = new Meta();
            meta.setTitle(sysMenu.getTitle());
            meta.setIcon(sysMenu.getIcon());
            meta.setExtraIcon(sysMenu.getExtraIcon());
            meta.setShowLink(sysMenu.getShowLink());
            meta.setShowParent(sysMenu.getShowParent());
            meta.setKeepAlive(sysMenu.getKeepAlive());
            meta.setFrameSrc(sysMenu.getFrameSrc());
            meta.setFrameLoading(sysMenu.getFrameLoading());
            meta.setHiddenTag(sysMenu.getHiddenTag());
            meta.setFixedTag(sysMenu.getFixedTag());
            meta.setActivePath(sysMenu.getActivePath());
            return meta;
        }
    }

    @Data
    public static class Transition {

        /**
         * 当前页面进场动画，比如 enterTransition: "animate__fadeInLeft"
         */

        private String enterTransition;

        /**
         * 当前页面离场动画，比如 leaveTransition: "animate__fadeOutRight"
         */

        private String leaveTransition;

        public static Transition of(SysMenu sysMenu) {
            Transition transition = new Transition();
            transition.setEnterTransition(sysMenu.getEnterTransition());
            transition.setLeaveTransition(sysMenu.getLeaveTransition());
            return transition;
        }
    }

    public static SysMenuRoutesResult of(SysMenu sysMenu) {
        SysMenuRoutesResult sysMenuRoutesResult = new SysMenuRoutesResult();
        sysMenuRoutesResult.setPath(sysMenu.getPath());
        sysMenuRoutesResult.setName(sysMenu.getName());
        sysMenuRoutesResult.setRedirect(sysMenu.getRedirect());
        sysMenuRoutesResult.setComponent(sysMenu.getComponent());
        Meta meta = Meta.of(sysMenu);
        sysMenuRoutesResult.setMeta(meta);
        return sysMenuRoutesResult;

    }
}
